import pandas as pd
import re
from typing import Dict

# 定义中英文符号映射关系
SYMBOL_MAPPING: Dict[str, str] = {
    # 基本标点
    ',': '，',
    '.': '。',
    ':': '：',
    ';': '；',
    '!': '！',
    '?': '？',
    '(': '（',
    ')': '）',
    '[': '【',
    ']': '】',
    '{': '｛',
    '}': '｝',
    '<': '《',
    '>': '》',
    '"': '“',
    "'": '‘',

    # 特殊符号
    '-': '—',
    '_': '＿',
    '*': '＊',
    '/': '／',
    '\\': '＼',
    '@': '＠',
    '#': '＃',
    '$': '＄',
    '%': '％',
    '&': '＆',
    '=': '＝',
    '+': '＋',

    # 数学符号
    '×': '×',
    '÷': '÷',
    '±': '±',
    '≈': '≈',
    '≠': '≠',
    '≤': '≤',
    '≥': '≥',
    '∞': '∞',

    # 货币符号
    '¥': '¥',
    '$': '$',
    '€': '€',
    '£': '£',

    # 空白字符
    ' ': '　',  # 英文空格 -> 中文全角空格
    '\t': '\t',
    '\n': '\n',
    '\r': '\r'
}


def normalize_symbols(text: str) -> str:
    """标准化符号字符串，移除所有非符号字符"""
    # 移除非符号字符（字母、数字、汉字等）
    return re.sub(r'[^\s\W]', '', text, flags=re.UNICODE).strip()


def map_symbols(eng_symbols: str, chi_symbols: str) -> str:
    """映射英文符号到中文符号"""
    mapped = ''.join(SYMBOL_MAPPING.get(char, char) for char in eng_symbols)
    return mapped


def check_symbol_content(symbol_df: pd.DataFrame) -> pd.DataFrame:
    """校对符号内容 - 使用规则匹配而非大模型"""
    results = []

    for _, row in symbol_df.iterrows():
        eng_content = str(row['英文内容'])
        chi_content = str(row['中文内容'])
        reason = row.get('分类原因', '未知')

        # 标准化符号内容
        eng_symbols = normalize_symbols(eng_content)
        chi_symbols = normalize_symbols(chi_content)

        # 情况1: 内容完全相同
        if eng_content == chi_content:
            result = "通过 (内容完全相同)"
            results.append({
                "全局行号": row["全局行号"],
                "校对结果": result,
                "分类原因": reason
            })
            continue

        # 情况2: 标准化后完全相同
        if eng_symbols == chi_symbols:
            result = "通过 (标准化后相同)"
            results.append({
                "全局行号": row["全局行号"],
                "校对结果": result,
                "分类原因": reason
            })
            continue

        # 情况3: 符号映射后匹配
        mapped_symbols = map_symbols(eng_symbols, chi_symbols)
        if mapped_symbols == chi_symbols:
            result = "通过 (符号映射匹配)"
            results.append({
                "全局行号": row["全局行号"],
                "校对结果": result,
                "分类原因": reason
            })
            continue

        # 情况4: 不匹配
        result = f"不匹配\n英文符号: {eng_symbols}\n中文符号: {chi_symbols}\n映射结果: {mapped_symbols}"
        results.append({
            "全局行号": row["全局行号"],
            "校对结果": result,
            "分类原因": reason
        })

    return pd.DataFrame(results)


# 测试函数
if __name__ == "__main__":
    # 创建测试数据
    test_data = [
        {"全局行号": 1, "英文内容": ",.!?", "中文内容": "，。！？", "分类原因": "标点符号"},
        {"全局行号": 2, "英文内容": "()[]{}", "中文内容": "（）【】{}", "分类原因": "括号"},
        {"全局行号": 3, "英文内容": "  \t\n", "中文内容": "　\t\n", "分类原因": "空白字符"},
        {"全局行号": 4, "英文内容": "abc", "中文内容": "abc", "分类原因": "错误分类"},
        {"全局行号": 5, "英文内容": "$100", "中文内容": "$100", "分类原因": "货币"},
        {"全局行号": 6, "英文内容": "*/*", "中文内容": "＊／＊", "分类原因": "特殊符号"},
        {"全局行号": 7, "英文内容": "hello", "中文内容": "world", "分类原因": "错误分类"},
    ]

    test_df = pd.DataFrame(test_data)
    results = check_symbol_content(test_df)

    print("符号校对结果:")
    print(results[["全局行号", "校对结果"]])